package cate.game.play.buff;


import cate.common.table.d.GDSkill;
import cate.game.play.fighter.Fighter;
import cate.game.play.fighter.HealResult;
import cate.game.play.proce.action.ctx.ActionCtx;
import cate.game.play.proce.action.ctx.SkillActionCtx;
import cate.game.play.proce.action.ctx.TimeActionCtx;
import cate.game.play.proce.move.MoveCtx;
import cate.game.play.proce.round.RoundCtx;
import cate.game.play.skill.Skill;
import cate.game.play.skill.effect.SkillEffect;
import easy.java.dev.note.NoteClass;
import easy.java.struct.ref.DoubleRef;


@NoteClass("buff处理器")
public class BuffHandler {

    public Buff buff;

    public void setBuff(Buff buff) {
        this.buff = buff;
    }

    public Buff getBuff() {
        return this.buff;
    }

    public void parse(String code) {}

    public void parseExt(String code){

    }

    public void onAdd(ActionCtx action) {
    }

    public boolean noMoveWithCtrl() {
        return false;
    }

    /** 本buff失效时 */
    public void onInvalid(ActionCtx action, byte invalidReason) {
    }

    /** buff拥有者死亡时 这细致到每个子技能或者buff导致的死亡 */
    public void onDead(ActionCtx action,Fighter killer) {}


    /** 击杀目标时 */
    public void onKill(ActionCtx action,Fighter deader){

    }

    /** 本人复活时 */
    public void onResurrect(ActionCtx action){

    }



    /** @return 回合开始时 */
    public void onRoundBegin(ActionCtx action){
    }

    /** @return 回合结束时 */
    public void onRoundEnd(ActionCtx action){
    }

    /**
     * 行动前
     * @param move
     */
    public void beforeOwnerMove(MoveCtx move,TimeActionCtx action) {

    }

    /**
     * 目标选择后(目标不可能为空)
     * @param action
     */
    public void afterSelectTargets(SkillActionCtx action,SkillEffect effect){

    }

    /**
     * 技能效果结算前（作为actor）
     * @param action
     * @param effect
     */
    public void beforeSkillSettleAsActor(SkillActionCtx action, SkillEffect effect, Fighter target){

    }

    /**
     * 技能效果结算前（作为target）
     * @param action
     * @param effect
     */
    public void beforeSkillSettleAsTarget(SkillActionCtx action, SkillEffect effect){

    }

    /**
     * 强制使用普攻
     * @param skill
     * @return 是否强制使用
     */
    public boolean forceUseAttack(RoundCtx round,Skill skill){
        return false;
    }

    /**
     * 本人攻击一次后
     * @param action
     * @param totalDamage
     * @param strike
     */
    public void afterOneAttack(SkillActionCtx action,byte nature, long totalDamage, boolean strike,Fighter target) {

    }

    /** @return 受到直接技能伤害后 */
    public void afterSufferOneAttack(SkillActionCtx action, long totalDamage, boolean strike){

    }


    /** @return 闪避后 */
    public void onMissAsTarget(SkillActionCtx action){

    }

    /** @return 伤害免疫 */
    public boolean hurtImmune(ActionCtx action,int reason){
        return false;
    }

    /**
     * 格挡处理
     * @param action
     * @return 是否格挡成功
     */
    public boolean hurtBlock(ActionCtx action) {
        return false;
    }

    /**
     * 伤害吸收处理
     * @param action
     * @param doubleRef
     */
    public double handleAbsorb(ActionCtx action, DoubleRef doubleRef) {
        return 0;
    }

    /**
     * 伤害分摊
     * @param action
     * @param doubleRef
     */
    public void shareDamage(ActionCtx action, Fighter actor,int reason, DoubleRef doubleRef){

    }

    /**
     * 修正分摊伤害
     * @param action
     * @param actor
     * @param buff
     * @param doubleRef
     */
    public void adjustShareDamage(ActionCtx action,Fighter actor, Buff buff, DoubleRef doubleRef){

    }

    /**
     * 修正伤害
     * @param action
     * @param reason
     * @param doubleRef
     */
    public void adjustSkillDamage(ActionCtx action, Fighter actor, int reason, DoubleRef doubleRef){

    }

    /**
     * 修正致死伤害
     * @param action
     * @param reason
     * @param doubleRef
     */
    public void adjustDeadlyDamage(ActionCtx action,Fighter actor, int reason, DoubleRef doubleRef){

    }

    /**
     * 修正治疗量
     * @param action
     * @param actor
     * @param doubleRef
     */
    public void adjustHeal(ActionCtx action,Fighter actor, DoubleRef doubleRef){

    }

    /**
     * 主动治疗后
     * @param action
     * @param target
     * @param healResult
     */
    public void onActiveHeal(SkillActionCtx action, Fighter target, HealResult healResult){

    }

    /**
     * 接受主动治疗后
     * @param action
     * @param healResult
     */
    public void onActiveHealAsTarget(SkillActionCtx action, HealResult healResult){

    }

    /**
     * buff拥有者行动结束后
     * @param move
     */
    public void onOwnerMoveDone(MoveCtx move,TimeActionCtx action){

    }

    /**
     * 全场有人行动结束后
     * @param move
     */
    public void onMoveDone(MoveCtx move, TimeActionCtx action){

    }

    /**
     * 立即复活
     * @param action
     * @return
     */
    public void immediateRebirth(ActionCtx action) {
    }

    /**
     * 允许被添加指定buff
     * @param action
     * @param buffToAdd
     * @return
     */
    public boolean allowAddBuff(ActionCtx action,Buff buffToAdd){
        return true;
    }

    public boolean allowAddBuffToTarget(ActionCtx action,Fighter target,Buff buffToAdd){
        return true;
    }

    /**
     * 觉醒变更
     * @param action
     */
    public void onAwaken(ActionCtx action,boolean start){

    }

    /**
     * 技能替换检测
     * @param oldSkill
     */
    public Skill handleReplace(RoundCtx round, Skill oldSkill){
        return null;
    }


    protected Fighter getFighterBySrc(byte src, Fighter actor, Fighter target) {
        switch (src) {
            case GDSkill.Base.CASTER:
                return actor;
            case GDSkill.Base.TARGET:
            default:
                return target;
        }
    }
}
